#include "MysqlConn.h"

// 初始化数据库连接
MysqlConn::MysqlConn()
{
    _conn = mysql_init(nullptr);
    // 设置编码
    mysql_set_character_set(_conn, "utf8");
}

// 释放数据库连接
MysqlConn::~MysqlConn()
{
    if (_conn)
    {
        mysql_close(_conn);
    }
    freeResult();
}

// 连接数据库
bool MysqlConn::connect(string user, string passwd, string dbName, string ip, unsigned short port)
{
    MYSQL *ptr = mysql_real_connect(_conn, ip.c_str(), user.c_str(), passwd.c_str(), dbName.c_str(), port, nullptr, 0);
    return ptr != nullptr;
}

// 更新数据库:isert,update,delete
bool MysqlConn::update(string sql)
{
    int ret = mysql_query(_conn, sql.c_str());
    return ret == 0;
}

// 查询数据库
bool MysqlConn::query(string sql)
{
    freeResult();
    if (mysql_query(_conn, sql.c_str()))
    {
        return false;
    }
    _result = mysql_store_result(_conn);
    return true;
}

// 遍历查询得到的结果集
bool MysqlConn::next()
{
    if (_result)
    {
        _row = mysql_fetch_row(_result);
        if (_row)
        {
            return true;
        }
    }
    return false;
}

// 得到结果集中的字段值
string MysqlConn::value(int index)
{
    int fieldsCount = mysql_num_fields(_result);
    if (index >= fieldsCount || index < 0)
    {
        return string();
    }
    char *val = _row[index];
    unsigned long length = mysql_fetch_lengths(_result)[index];
    return string(val, length);
}

// 事务操作
bool MysqlConn::transaction()
{
    return mysql_autocommit(_conn, 0);
}

// 提交事务
bool MysqlConn::commit()
{
    return mysql_commit(_conn);
}

// 事务回滚
bool MysqlConn::rollback()
{
    return mysql_rollback(_conn);
}

void MysqlConn::freeResult()
{
    if (_result)
    {
        mysql_free_result(_result);
        _result = nullptr;
    }
}

// 刷新起始的空闲时间点
void MysqlConn::refreshAliveTime()
{
    _aliveTime = steady_clock::now();
}

// 计算存活总时长
long long MysqlConn::getAliveTime()
{
    nanoseconds res = steady_clock::now() - _aliveTime;
    milliseconds millisec = duration_cast<milliseconds>(res);
    return millisec.count();
}